﻿using System;
using System.Collections.Generic;
using System.Collections;

namespace CMS.Core.DataInterfaces
{
    public interface IDao<T, IdT>
    {
        T GetById(IdT id, bool shouldLock);
        T GetById(IdT id);
        List<T> GetAll();
        List<T> GetByExample(T exampleInstance, params string[] propertiesToExclude);
        T GetUniqueByExample(T exampleInstance, params string[] propertiesToExclude);
        T Save(T entity);
        T SaveOrUpdate(T entity);
        void Delete(T entity);
        void CommitChanges();
       
        //Methodes extend

        /// <summary>
        /// Cập nhật đối tượng
        /// </summary>
        /// <param name="entity"></param>
        /// <returns></returns>
        bool Update(T entity);
        /// <summary>
        /// Lấy danh sách của đối tượng với trường thuộc tính cần sắp xếp
        /// </summary>
        /// <param name="propertyOrder">Tên trường thuộc tính</param>
        /// <param name="isAsc">true: Tăng dần, false: giảm dần</param>
        /// <returns>Danh sách của đối tượng</returns>
        List<T> GetAllOrderField(string propertyOrder, bool isAsc);
        /// <summary>
        /// Lấy danh sách các đối tượng với tập các Ids cho trước
        /// </summary>
        /// <param name="IDs"></param>
        /// <returns></returns>
        List<T> GetListIDs(String IDs);
        /// <summary>
        /// Lấy danh sách theo điều kiện truy vấn bằng ngôn ngữ HQL
        /// </summary>
        /// <param name="query">Chuuỗi truy vấn</param>
        /// <param name="min">Bản ghi nhỏ nhất cần lấy</param>
        /// <param name="max">Số lượng các bản ghi cần lấy</param>
        /// <returns>Danh sách các thuộc tính theo truy vấn</returns>
        IList GetHQLMinMaxResult(String query, int min, int max);
        /// <summary>
        /// Lấy danh sách của lớp đối tượng với truờng cần truy vấn theo điều kiện like
        /// </summary>
        /// <param name="profertyName">Tên trường thuộc tính</param>
        /// <param name="value">Giá trị cần lấy theo điều kiện</param>
        /// <returns>Lấy danh sách của lớp đối tượng</returns>
        List<T> GetFieldLikeCriteria(string profertyName, string value);
        /// <summary>
        /// Lấy danh sách của lớp đối tượng với truờng cần truy vấn theo điều kiện bằng
        /// </summary>
        /// <param name="profertyName">Tên trường thuộc tính</param>
        /// <param name="value">Giá trị cần lấy theo điều kiện</param>
        /// <returns>Lấy danh sách của lớp đối tượng</returns>
        List<T> GetFieldEqualCriteria(string profertyName, object value);
        /// <summary>
        /// Lấy danh sách các thuộc tính theo điều kiện bằng ngôn ngữ HQL
        /// </summary>
        /// <param name="query">Chuỗi truy vấn</param>
        /// <returns>Danh sách các thuộc tính theo điều kiện</returns>
        IList GetHQL(String query);
        /// <summary>
        /// Lấy danh sách đối tượng bằng HQL
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        List<T> GetHQLListT(String query);
        /// <summary>
        /// Xóa các đối tượng bằng ngôn ngữ HQL
        /// </summary>
        /// <param name="query">Câu lệnh truy vấn xóa</param>
        /// <returns>True: Xóa thành công, false: Xóa không thành công</returns>
        bool DeleteHQL(String query);
        /// <summary>
        /// /Xóa nhiều đối tượng với danh sách các mã của đối tượng được phân cách nhau bởi dấu phẩy
        /// </summary>
        /// <param name="IDs"></param>
        /// <returns></returns>
        bool DeleteListIDs(String IDs);
        /// <summary>
        /// Kiểm tra sự tồn tại giá trị của 1 trường thuộc tính trong CSDL
        /// </summary>
        /// <param name="fieldname">Tên trường thuộc tính</param>
        /// <param name="value">Giá trị trường thuộc tính</param>
        /// <returns>True: đã tồn tại; false: không tồn tại</returns>
        bool IsExist(String fieldname, object value);
        /// <summary>
        /// Kiểm tra sự tồn tại giá trị của 1 trường thuộc tính trong khoản so sánh
        /// </summary>
        /// <param name="fieldname">Tên trường thuộc tính</param>
        /// <param name="value1">Giá trị đầu</param>
        /// <param name="value2">Giá trị cuối</param>
        /// <returns>True: đã tồn tại; false: không tồn tại</returns>
        bool IsExistBetween(String fieldname, object value1, object value2);

        bool IsExist(String fieldname, object value, String MaValue);
        bool IsExist(String fieldname, object value, object MaValue);
        bool IsExistText(string fieldname, object value, string MaValue);


        /// <summary>
        /// Lấy danh sách tất cả các đối tượng có Order theo các thứ tự ưu tiên
        /// </summary>
        /// <param name="propertiesOrder"></param>
        /// <param name="isAsc"></param>
        /// <returns></returns>
        List<T> GetAllOrderMoreFields(string[] propertiesOrder, bool isAsc);

        List<T> GetAllWithMoreFieldsAndOderBy(bool IsEqual, string[] properties, Object[] values, string[] propertiesOrder, bool isAsc);
    }
}
